#include	<pic.h>

/*
 *	Interrupt demo for PIC; wait for button press on RB0/INT,
 *	turn on a relay on another port bit for a period of time.
 *	For simplicity here, literal constants are used, usually these
 *	should be calculated with compile-time arithmetic.
 */

#define RELAY RB4					// use this bit to drive relay

static unsigned int	relay_timer;	// timer value for relay driver

void
main(void)
{
	/* setup stuff */

	RELAY = 1;		// ensure relay is off before enabling output
	TRISB = 0x03;	// Port B bits 7 and 6 are output 

	OPTION	= 0b00000111;
	TRISB	= 0b00000011;

	RBPU = 0;		// Use internal pullups
	T0IE = 1;		// Enable interrupt on TMR0 overflow
	INTEDG = 1;		// falling edge trigger the interrupt
	INTE = 1;		// enable the external interrupt
	GIE = 1;		// Global interrupt enable
	for(;;){
		CLRWDT();	// Idly kick the dog
	}
}

static void interrupt
isr(void)			// Here be interrupt function - the name is unimportant.
{
	if(T0IF) {				// timer interrupt
		PORTB ^= 4;
		if(relay_timer){// is the relay timer running?
			relay_timer--;	// decrement it
			PORTB |= 8;
		}else{
			RELAY = 1;		// turn the relay off
			PORTB &= ~8;	// toggle a bit to say we're alive
		}
		T0IF = 0;			// clear the interrupt flag
	}
	if(INTF) {				// did we see a button press?
		RELAY = 0;			// turn the relay on
		relay_timer = 16;	// start the timer - 16 timeouts ~ 1 second
		INTF = 0;			// clear the interrupt
	}
}

